package cn.tedu.charging.order.config;

import cn.tedu.charging.common.constant.AmqpComponentConst;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 位订单做延迟 检查设备无响应 做组件声明
 * 死信实现的延迟结构
 */
@Configuration
@Slf4j
public class AmqpDelayDeclareConfiguration {
    //声明业务交换机 简化使用 使用fanout类型
    @Bean
    public Exchange delayBillEx(){
        //名字 属性值 可以放到常量里
        return ExchangeBuilder.fanoutExchange(AmqpComponentConst.DELAY_BILL_EX).build();
    }
    //声明业务队列 需要包含3个属性 消息超时时间1分钟 死信交换机 死信路由key
    @Bean
    public Queue delayBillQueue(){
        return QueueBuilder.nonDurable(AmqpComponentConst.DELAY_BILL_QUEUE)
                .ttl(1000*60)//配置 x-message-ttl=1000*60
                .deadLetterExchange(AmqpComponentConst.DELAY_BILL_DL_EX)//配置 x-dead-letter-exchange
                .deadLetterRoutingKey(AmqpComponentConst.DELAY_BILL_DL_RK)
                .build();
    }
    //将业务队列和业务交换机绑定 交换机fanout类型 只要绑定就定义有消息转发
    @Bean
    public Binding delayBillBinding(){
        return BindingBuilder.bind(delayBillQueue()).to(delayBillEx()).with("")
                .noargs();
    }
    //延迟死信队列
    @Bean
    public Queue delayBillDlQueue(){
        return QueueBuilder.nonDurable(AmqpComponentConst.DELAY_BILL_DL_QUEUE).build();
    }
    //延迟死信交换机
    @Bean
    public Exchange delayBillDlEx(){
        //类型保证是direct
        return ExchangeBuilder.directExchange(AmqpComponentConst.DELAY_BILL_DL_EX).build();
    }
    //死信延迟队列和死信交换机绑定路由key
    @Bean
    public Binding delayBillDlBinding(){
        return BindingBuilder.bind(delayBillDlQueue()).to(delayBillDlEx())
                .with(AmqpComponentConst.DELAY_BILL_DL_RK).noargs();
    }
}
